package ar.edu.utn.frba.disenio.aterrizar.busquedas;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import ar.edu.utn.frba.disenio.aterrizar.aerolineas.*;
import ar.edu.utn.frba.disenio.aterrizar.usuario.Usuario;

public class BusquedaObligatoria extends BusquedaFiltrada{
	
	Aerolinea adapter;
	CriterioBusqueda busqueda;
	Usuario usuario;
	private int cantMaxEscalas = 2;

	
	public BusquedaObligatoria(Aerolinea unaAerolinea, CriterioBusqueda unaBusqueda, Usuario unUsuario){
		this.adapter = unaAerolinea;
		this.busqueda = unaBusqueda;
		this.usuario = unUsuario;
		
	}
	
	public BusquedaObligatoria(){		
	}
			
	@Override
	public ArrayList<Vuelo> buscarVuelos(){
		
		ArrayList<Vuelo> disponibles = this.adapter.buscarVuelos(busqueda);
		
		if((this.busqueda.getEscalas() > 0) && (this.busqueda.getEscalas() <= this.cantMaxEscalas) )	{
			
			ArrayList<Vuelo> candidatosOrigenRaw = this.adapter.buscarVuelosPorOrigen(busqueda.getOrigen(), busqueda.getFecha());
			ArrayList<Vuelo> candidatosOrigen= new ArrayList<Vuelo>();
			
			for(Vuelo unCandidatoRaw :  candidatosOrigenRaw){
				VueloConEscalas vueloConEscalas = new VueloConEscalas();
				vueloConEscalas.agregarVuelo(unCandidatoRaw);
				candidatosOrigen.add(vueloConEscalas);				
			}
			
			ArrayList<Vuelo> candidatosEscalas = new ArrayList<Vuelo>();
			while(this.busqueda.decrementarEscalas() >= 0){
				
				for(Vuelo unCandidatoEscalas : candidatosOrigen){
					ArrayList<Vuelo> todosLosCandidatos =this.adapter.buscarVuelosPorOrigen(unCandidatoEscalas.destino, unCandidatoEscalas.fechaLlegada);
				
					for(Vuelo unCandidatoAgregar : todosLosCandidatos){
												
						if(this.elVueloEsPosterior(unCandidatoEscalas,unCandidatoAgregar) ){
							VueloConEscalas vueloConEscalasAgregadas = new VueloConEscalas();
							for(Vuelo vuelosEnEscalas : unCandidatoEscalas.getVuelos()){
								vueloConEscalasAgregadas.agregarVuelo(vuelosEnEscalas);
							}
							vueloConEscalasAgregadas.agregarVuelo(unCandidatoAgregar);
							candidatosEscalas.add(vueloConEscalasAgregadas);
						}
					}
				}
				candidatosOrigen.clear();
				for(Vuelo nuevosCandidatosOrigen : candidatosEscalas){
					candidatosOrigen.add(nuevosCandidatosOrigen);
				}
				candidatosEscalas.clear();
			}
			for(Vuelo unVueloConEscalas: candidatosOrigen){
				if(unVueloConEscalas.destino.equals(this.busqueda.destino)){
					disponibles.add(unVueloConEscalas);
				}
			}			
		}
		ArrayList<Vuelo> retVal = new ArrayList<Vuelo>();
		
		for(Vuelo unVuelo : disponibles){
			unVuelo.aplicarRecargo(adapter.recargoAerolinea, usuario.getRecargoUsuario());
			if((unVuelo.esSuperOferta(unVuelo) && usuario.isSuperOfertas()) || !unVuelo.esSuperOferta(unVuelo)){
				retVal.add(unVuelo);	
			}			
        }  
		
		return retVal;
    }
	
	private boolean elVueloEsPosterior(Vuelo unCandidatoEscalas,Vuelo unCandidatoAgregar) {
		String fecha1 = (unCandidatoEscalas.fechaLlegada.convertirAString() + " " + unCandidatoEscalas.horaLlegada);
		String fecha2 = (unCandidatoAgregar.fechaSalida.convertirAString() + " " + unCandidatoAgregar.horaSalida);
		long duracion = 0;
		try{
			SimpleDateFormat formato = new SimpleDateFormat("dd/mm/yyyy hh:mm");
			Date unDate = formato.parse(fecha1);
			Date otroDate = formato.parse(fecha2);
			long salidaUnVuelo = unDate.getTime();
			long llegadaUnVuelo = otroDate.getTime();
			duracion = (llegadaUnVuelo - salidaUnVuelo )/(1000*60);
			
        }catch(ParseException e){
        	System.out.println("No se pudo sacar hora");
        }
        if(duracion > 0){
			return true;
		}
		else{
			return false;
		}
		
	}

	
	
}